package com.wang.spring.lifecycle.c_initializingbean;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class InitializingDisposableAnnoApplication {
    public static void main(String[] args) {
        /**
         * 准备初始化IOC 容器
         * Pen 钢笔中已经加满墨水  InitializingBean.afterPropertiesSet
         * IOC容器初始化完成。。。
         * ======================
         * 准备销毁IOC容器。。。
         * Pen 钢笔中墨水都放干净了  DisposableBean.destroy
         * 销毁IOC容器。。。完成
         *
         * test1 的打印结果
         */
//        test1();

        test2();
    }

    private static void test1() {
        System.out.println("准备初始化IOC 容器");
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext("com.wang.spring.lifecycle.c_initializingbean");
        System.out.println("IOC容器初始化完成。。。");
        System.out.println("======================");
        System.out.println("准备销毁IOC容器。。。");
        ctx.close();
        System.out.println("销毁IOC容器。。。完成");
    }


    /**
     * 准备初始化IOC 容器
     * @PostConstruct 开始执行 加墨水
     * Pen3 钢笔中已经加满墨水  InitializingBean.afterPropertiesSet
     * init-method 打开钢笔
     * IOC容器初始化完成。。。
     * ======================
     * 准备销毁IOC容器。。。
     * @PreDestroy 销毁 导出墨水
     * Pen3 钢笔中墨水都放干净了  DisposableBean.destroy
     * destroy-method 合上钢笔
     * 销毁IOC容器。。。完成
     *
     *
     * 从 test2 的打印结果来看 单例Bean的声明周期的顺序是  ：
     * java的标准  @@PostConstruct->  InitializingBean.afterPropertiesSet -> init-method
     * 按照这个顺序来的
     */
    private static void test2() {
        System.out.println("准备初始化IOC 容器");
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AllLifeConfiguration.class);

        System.out.println("IOC容器初始化完成。。。");
        System.out.println("======================");
        System.out.println("准备销毁IOC容器。。。");
        ctx.close();
        System.out.println("销毁IOC容器。。。完成");
    }
}
